Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Polish Card component. #35245

Closed
wants to merge 4 commits into from
Closed

Polish Card component. #35245

wants to merge 4 commits into from

Conversation

jasmussen
Copy link
Contributor

Description

Followup to #35219 (comment). The Card component has a bordered option which paints a drop shadow around it.

This drop shadow is outset, so even though it has the correct 2px border radius applied to it, it appears as a 3px border radius. In addition to this, the fact that it is semitransparent is not visible as the color doesn't overlay the background color inside:

before

This PR changes that box shadow to be inset, which both fixes the radius, and makes it overlay the color, and simply darken it instead:

after

How has this been tested?

Open the site editor, open global styles, observe the style card. It's easiest with a theme that has a colored background, such as TT1 blocks.

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR (please manually search all *.native.js files for terms that need renaming or removal).

@github-actions
Copy link

github-actions bot commented Sep 30, 2021

Size Change: +16 B (0%)

Total Size: 1.07 MB

Filename Size Change
build/components/index.min.js 217 kB +16 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 931 B
build/admin-manifest/index.min.js 1.09 kB
build/annotations/index.min.js 2.7 kB
build/api-fetch/index.min.js 2.21 kB
build/autop/index.min.js 2.08 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.2 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/index.min.js 134 kB
build/block-editor/style-rtl.css 13.9 kB
build/block-editor/style.css 13.9 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 474 B
build/block-library/blocks/button/editor.css 474 B
build/block-library/blocks/button/style-rtl.css 600 B
build/block-library/blocks/button/style.css 600 B
build/block-library/blocks/buttons/editor-rtl.css 315 B
build/block-library/blocks/buttons/editor.css 315 B
build/block-library/blocks/buttons/style-rtl.css 370 B
build/block-library/blocks/buttons/style.css 370 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 206 B
build/block-library/blocks/columns/editor.css 205 B
build/block-library/blocks/columns/style-rtl.css 497 B
build/block-library/blocks/columns/style.css 496 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.17 kB
build/block-library/blocks/cover/style.css 1.17 kB
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 322 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 977 B
build/block-library/blocks/gallery/editor.css 982 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.59 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 502 B
build/block-library/blocks/image/style.css 505 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 568 B
build/block-library/blocks/navigation-link/editor.css 570 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 300 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/style-rtl.css 195 B
build/block-library/blocks/navigation-submenu/style.css 195 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.72 kB
build/block-library/blocks/navigation/editor.css 1.72 kB
build/block-library/blocks/navigation/style-rtl.css 1.62 kB
build/block-library/blocks/navigation/style.css 1.61 kB
build/block-library/blocks/navigation/view.min.js 2.74 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 377 B
build/block-library/blocks/page-list/editor.css 377 B
build/block-library/blocks/page-list/style-rtl.css 198 B
build/block-library/blocks/page-list/style.css 198 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 B
build/block-library/blocks/post-author/editor-rtl.css 210 B
build/block-library/blocks/post-author/editor.css 210 B
build/block-library/blocks/post-author/style-rtl.css 182 B
build/block-library/blocks/post-author/style.css 181 B
build/block-library/blocks/post-comments-form/style-rtl.css 140 B
build/block-library/blocks/post-comments-form/style.css 140 B
build/block-library/blocks/post-comments/style-rtl.css 360 B
build/block-library/blocks/post-comments/style.css 359 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 396 B
build/block-library/blocks/post-featured-image/editor.css 397 B
build/block-library/blocks/post-featured-image/style-rtl.css 156 B
build/block-library/blocks/post-featured-image/style.css 156 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 391 B
build/block-library/blocks/post-template/style.css 392 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 60 B
build/block-library/blocks/post-title/style.css 60 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 378 B
build/block-library/blocks/pullquote/style.css 378 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 262 B
build/block-library/blocks/query-pagination/editor.css 255 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query-title/editor-rtl.css 85 B
build/block-library/blocks/query-title/editor.css 85 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 220 B
build/block-library/blocks/quote/theme.css 222 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 374 B
build/block-library/blocks/search/style.css 375 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 250 B
build/block-library/blocks/separator/style.css 250 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 769 B
build/block-library/blocks/site-logo/editor.css 769 B
build/block-library/blocks/site-logo/style-rtl.css 165 B
build/block-library/blocks/site-logo/style.css 165 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 165 B
build/block-library/blocks/social-link/editor.css 165 B
build/block-library/blocks/social-links/editor-rtl.css 812 B
build/block-library/blocks/social-links/editor.css 811 B
build/block-library/blocks/social-links/style-rtl.css 1.3 kB
build/block-library/blocks/social-links/style.css 1.3 kB
build/block-library/blocks/spacer/editor-rtl.css 307 B
build/block-library/blocks/spacer/editor.css 307 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 636 B
build/block-library/blocks/template-part/editor.css 635 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/term-description/editor-rtl.css 90 B
build/block-library/blocks/term-description/editor.css 90 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 815 B
build/block-library/common.css 812 B
build/block-library/editor-rtl.css 9.8 kB
build/block-library/editor.css 9.79 kB
build/block-library/index.min.js 148 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 10.3 kB
build/block-library/style.css 10.3 kB
build/block-library/theme-rtl.css 665 B
build/block-library/theme.css 669 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 45.7 kB
build/components/style-rtl.css 15.2 kB
build/components/style.css 15.2 kB
build/compose/index.min.js 10.4 kB
build/core-data/index.min.js 12.4 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 614 B
build/data/index.min.js 7.1 kB
build/date/index.min.js 31.5 kB
build/deprecated/index.min.js 428 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.46 kB
build/edit-navigation/index.min.js 15.3 kB
build/edit-navigation/style-rtl.css 3.74 kB
build/edit-navigation/style.css 3.74 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 29.3 kB
build/edit-post/style-rtl.css 7.2 kB
build/edit-post/style.css 7.19 kB
build/edit-site/index.min.js 29.7 kB
build/edit-site/style-rtl.css 5.53 kB
build/edit-site/style.css 5.53 kB
build/edit-widgets/index.min.js 15.7 kB
build/edit-widgets/style-rtl.css 4.1 kB
build/edit-widgets/style.css 4.1 kB
build/editor/index.min.js 37.5 kB
build/editor/style-rtl.css 3.78 kB
build/editor/style.css 3.77 kB
build/element/index.min.js 3.17 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 5.93 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.6 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.72 kB
build/keycodes/index.min.js 1.3 kB
build/list-reusable-blocks/index.min.js 1.85 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 845 B
build/nux/index.min.js 2.03 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.83 kB
build/primitives/index.min.js 921 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/redux-routine/index.min.js 2.63 kB
build/reusable-blocks/index.min.js 2.19 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.6 kB
build/server-side-render/index.min.js 1.52 kB
build/shortcode/index.min.js 1.48 kB
build/token-list/index.min.js 562 B
build/url/index.min.js 1.74 kB
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.11 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@youknowriad
Copy link
Contributor

This doesn't work well when you apply the isShady variation in CardHeader or CardFooter... (You can try in storybook)

@jasmussen
Copy link
Contributor Author

Can you elaborate on that? As far as I can tell, the box-shadow/border is removed intentionally and entirely when is-shady is applied:
Screenshot 2021-09-30 at 11 31 40

@youknowriad
Copy link
Contributor

@jasmussen no it's not removed intentionally, you can try reverting your change and see the result (it's specially not great for CardBody and Footer IMO)

@jasmussen
Copy link
Contributor Author

jasmussen commented Sep 30, 2021

Of course yes, thank you, I see it now:

Screenshot 2021-09-30 at 11 37 02

The alternative I can think of is to change the border-radius value so that it renders as 2px despite being outset. We've done that in some of the SCSS files using border-radius: $radius-block-ui - $border-width; with a comment above it. Would something similar work here?

Edit: I have a separate question on whether we should have an "is-shady" property for the card component at all, but that's unrelated to your point.

@youknowriad
Copy link
Contributor

Edit: I have a separate question on whether we should have an "is-shady" property for the card component at all, but that's unrelated to your point.

That is something I was wondering as well. Maybe we could drop support for that entirely (especially for body) but it'd still be great if the border is shown around the "shady" header as this is more common. Components folks should have a better opinion here @ciampo

@ciampo
Copy link
Contributor

ciampo commented Sep 30, 2021

The reason why the original approach is not working is that the inset box-shadow gets rendered underneath the other child elements (CardHeader, CardBody, CardFooter, ...).
When CardHeader is in its normal state, its background is transparent, and therefore it's possible to see-through it. When the isShady prop is toggled, CardHeader's background becomes a solid color (light gray), and therefore the inset box-shadow is hidden under it.

One possible solution is to use a pseudo-element (via ::before or ::after) to render the box-shadow on top of the card's content (and use pointer-events: none to have all mouse events pass through this new layer).

Here's the code that I wrote to try this out on my machine (expand to reveal it)
diff --git a/packages/components/src/card/styles.js b/packages/components/src/card/styles.js
index 70280ebc72..c8ce8f32b2 100644
--- a/packages/components/src/card/styles.js
+++ b/packages/components/src/card/styles.js
@@ -9,8 +9,20 @@ import { css } from '@emotion/react';
 import { COLORS, CONFIG } from '../utils';
 
 export const Card = css`
-	box-shadow: inset 0 0 0 1px ${ CONFIG.surfaceBorderColor };
 	outline: none;
+
+	&::before {
+		content: '';
+
+		box-shadow: inset 0 0 0 1px ${ CONFIG.surfaceBorderColor };
+		position: absolute;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		left: 0;
+
+		pointer-events: none;
+	}
 `;
 
 export const Header = css`
@@ -77,7 +89,9 @@ export const borderColor = css`
 `;
 
 export const boxShadowless = css`
-	box-shadow: none;
+	&::before {
+		content: none;
+	}
 `;
 
 export const borderless = css`

From a quick look, this seems to apply the changes that @jasmussen was looking for, without the drawbacks of the original approach. Although we'd need to investigate this a bit better to make sure we're not introducing a breaking change.

I have a separate question on whether we should have an "is-shady" property for the card component at all, but that's unrelated to your point.

That is something I was wondering as well. Maybe we could drop support for that entirely (especially for body) but it'd still be great if the border is shown around the "shady" header as this is more common. Components folks should have a better opinion here @ciampo

I'm not sure about the historical reasons for this prop to exists. Card is one of the oldest and most used components, and it's hard to know if removing the 'isShady` prop is going to cause much disruption. I guess at most we could look into marking it as deprecated and remove it from docs, while still supporting it in code (and eventually remove it once enough time has passed from the deprecation notice)?

@youknowriad
Copy link
Contributor

I'm not sure about the historical reasons for this prop to exists. Card is one of the oldest and most used components

Actually Card is not that old in the history of Gutenberg and is only used twice in Core's codebase.

@ciampo
Copy link
Contributor

ciampo commented Sep 30, 2021

I'm not sure about the historical reasons for this prop to exists. Card is one of the oldest and most used components

Actually Card is not that old in the history of Gutenberg and is only used twice in Core's codebase.

Oh ok, thank you for sharing the knowledge! I remember that it is used in WordPress.com and WooCommerce, although I don't know to which extent.

@jasmussen
Copy link
Contributor Author

I wonder what an actionable next step on this one is. I wouldn't call it urgent, but it seems like a nice little microcosm of adopting and adapting the components, and therefore a good exercise:

  • Where's the card used at the moment?
  • What is it used for, and does it accomplish that?

While I imagine a bordered card can be useful, if we find that it isn't, it might be worth simply removing that prop entirely. Just as an example, the ItemGroup is bordered, as are each item inside, and they always will be. This one probably doesn't need any prop to tell it to be bordered. Are we looking at something similar for the card?

@ciampo
Copy link
Contributor

ciampo commented Oct 13, 2021

I think a good approach here could be to treat each question separately:

  • We could merge this PR with the improvements to the border (I pushed the changes that I had previously suggested, updated tests and rebased)
  • We could then investigate / discuss in a separate issue the component's usage and the need for:
    • the isShady prop
    • borders (and, consequently, the isBorderless prop)

What do folks think?

@ciampo ciampo added [Feature] UI Components Impacts or related to the UI component system [Type] Enhancement A suggestion for improvement. labels Oct 13, 2021
@jasmussen
Copy link
Contributor Author

Thanks for sheparding this along!

I do wonder if the pseudo element is overding it, though, considering it's just a border. It's not a strong opinion I have — but might there be side effects we don't want? Did we look at the usage of the component and see whether a "bordered" version was even necessary?

@ciampo
Copy link
Contributor

ciampo commented Oct 14, 2021

I do wonder if the pseudo element is overding it, though, considering it's just a border. It's not a strong opinion I have — but might there be side effects we don't want?

The only side - effect I can think of is if someone was already relying on the ::before pseudo element to achieve any other feature. If you prefer, we can also introduce one additional element (instead of using ::before) and apply the same styles.

Did we look at the usage of the component and see whether a "bordered" version was even necessary?

I has a quick look around the repo to see how the component is used:

On top of these usage, I know for sure that this component is currently used in WordPress.com (I believe for the cards used to display the "in-editor" welcome tour) and in some WooCommerce dashboard. There may be more usages that we're not aware of.

If we need just a "empty box", we could use the Surface component instead.

IMO, when I think of a Card component, I can see the need for a border. It's also worth noting that the Card component has a border by default, unless explicitly disabled with the isBorderless prop.

@jasmussen
Copy link
Contributor Author

Good thoughts. I recall @jameskoster mentioning a "Card" component back in the day, if you have time to look, what are your thoughts? Is a "bordered" property a good aspect of a card? What do you see the card accomplishing? Thanks all.

@jameskoster
Copy link
Contributor

The border property is useful in situations where a card sits on a field that shares the background color.

Probably a dumb question, but is there a reason we're using a box-shadow here instead of a simple border?

@jasmussen
Copy link
Contributor Author

Probably a dumb question, but is there a reason we're using a box-shadow here instead of a simple border?

The primary reason for me is to keep a consistent and predictable 2px border radius, which works because the shadow can overlay inwards. Of course that can be worked around. The other reason is to make the border color semitransparent, so it picks up color from the background of the card, as shown in the 2nd picture of the PR. I don't have strong opinions in either direction, so long as we land on the right radius.

@jameskoster
Copy link
Contributor

The primary reason for me is to keep a consistent and predictable 2px border radius

border always respects border-radius, no? 🤔

The other reason is to make the border color semitransparent, so it picks up color from the background of the card, as shown in the 2nd picture of the PR

That one seems a bit situational. I can see how it works elegantly here, but it might be less desirable in other situations. If anything this feels like it should be a separate property 😬

@jasmussen
Copy link
Contributor Author

The border radius always works, yes, but if I apply border-radius: 2px; to the card, the border will be outset and come across as a 3px radius. The fix is something like border-radius: $radius-block-ui - $border-width;, which is fine.

The overlaid border is situational, yes, but I've come to be very careful with adding borders as they so quickly end up adding noise, conflicting with input fields and focus styles. And anything we can do to reduce borders, including have them blend better with background colors, is usually a win.

But it's not a strong opionin. I like the simplicity of border. We just want to make sure and account for what offset it might add, if any, if a bordered card is to stack next to a non-bordered card, so there isn't a pixel shift.

@jameskoster
Copy link
Contributor

jameskoster commented Oct 18, 2021

The border radius always works, yes, but if I apply border-radius: 2px; to the card, the border will be outset and come across as a 3px radius.

When using a shadow, yes. I'm suggesting to use border rather than a shadow. That way the radius is always respected.

I've come to be very careful with adding borders

I 100% agree with this sentiment, but we can't always know the circumstances in which Card will be used. A border is a pretty standard feature of a Card component evidenced by its usage on both WordPress.com and WooCommerce.

We just want to make sure and account for what offset it might add

We could potentially offset the padding based on the border width? 🤔

Here's a codepen.

@ciampo
Copy link
Contributor

ciampo commented Oct 18, 2021

@griffbrad do you remember if there was any technical reason why the Card component used box-shadow to render a border?

@griffbrad
Copy link

@griffbrad do you remember if there was any technical reason why the Card component used box-shadow to render a border?

I don’t believe there is a technical reason, no. @ItsJonQ’s original Card component didn’t take this approach itself. I do think @jasmussen’s rationale above, though (“to make the border color semitransparent, so it picks up color from the background of the card”) aligns with design feedback I’ve seen on other work recently.

@ciampo
Copy link
Contributor

ciampo commented Nov 15, 2021

Hey @jasmussen , what should the next steps be for this PR? Should we go ahead and test/merge these changes, or should we close it?

@jasmussen
Copy link
Contributor Author

I'm a little nervous about using the pseudo selector approach for this, it feels like it's adding some complexity to something that should probably be simple.

I think it's fine to shelve/close/pause this PR for now. Even as an exploration, it has been valuable in surfacing some of the needs of the system, compared to what the components offer. For example I remain unconvinced that we need a cardheader and card footer at all — or even just that we don't want border separators between them. And if we were to decide in that way, it might offer us a different path forward to our goal that simplifies things.

As is, and looking purely as Gutenberg as the consumer, the Card appears to have been designed in isolation without a clear problem to solve. That's not a critique of the work, but rather a challenge to our assumptions about which components we should have, and how they should be used.

@ciampo
Copy link
Contributor

ciampo commented Nov 16, 2021

I'm a little nervous about using the pseudo selector approach for this, it feels like it's adding some complexity to something that should probably be simple.

This makes sense

For example I remain unconvinced that we need a cardheader and card footer at all — or even just that we don't want border separators between them. [...] As is, and looking purely as Gutenberg as the consumer, the Card appears to have been designed in isolation without a clear problem to solve.

I definitely share a similar opinion too — not exactly sure why we have card headers / footers / body (although I do think that it's nice to have the possibility to show a border).

From what I understand, the components package was initially created by putting together a few "shared" components across Gutenberg. The package lacked an overarching design system, and its components were mostly built out of necessity — which ultimately means that components are not always "consistent" and "coeherent" in terms of design language, public APIs, and also implementation.

That's not a critique of the work, but rather a challenge to our assumptions about which components we should have, and how they should be used.

Absolutely. The challenge now is to incrementally improve this package without introducing breaking changes — and your feedback has definitely helped a lot already!

I'm going to close this PR for now, we can always re-open it in case

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Feature] UI Components Impacts or related to the UI component system [Package] Components /packages/components [Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants